package com.manager;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;

import com.Reporte;

import exceptions.InvalidArgumentException;

public class ReporteFactory {

	static private ReporteFactory reportManager = new ReporteFactory();

	private Map<Integer, Reporte> reportes = new HashMap<Integer, Reporte>();

	private ReporteFactory() {
	}

	static public ReporteFactory getInstance() {
		return reportManager;
	}

	public Reporte getReporte(String idReporte)
			throws CloneNotSupportedException, InvalidArgumentException {
		if (idReporte == null)
			throw new InvalidArgumentException("Esperado parametro: idReporte");
		Reporte reporte = reportes.get(new Integer(idReporte));
		if (reporte == null)
			throw new InvalidArgumentException("El Reporte con Id= "+ idReporte + "  no esta Registrado");
		return (Reporte) reporte.clone();
	}

	public void cargarReportes() throws ClassNotFoundException, SQLException,
			InstantiationException, IllegalAccessException,
			InvalidArgumentException {
		Connection connection = PoolDataSource.getInstance().getConection(PoolDataSource.REPORTES);
		try {
			Statement statement = connection.createStatement();
			ResultSet rs = statement.executeQuery("Select id,clase,rutaReporte from Reportes");
			this.reportes.clear();
			while (rs.next()) {
				Reporte reporte = (Reporte)java.lang.Class.forName(rs.getString("clase")).newInstance();
				reporte.setRutaReporte(rs.getString("rutaReporte"));
				this.reportes.put(rs.getInt("id"), reporte);
			}
		} catch (SQLException e) {
			connection.close();
			throw e;
		} catch (IllegalArgumentException e) {
			throw new InstantiationException(e.getMessage());
		}
	}

}
